/**
 * FileName:RoleApi.java
 * Author: TangZaoBang
 * Date: 2023/06/05 13:09
 * Description:
 * <p>
 * History:
 * <author> TangZaoBang
 * <time> 2023/06/05 13:09
 * <version> 1.0.0
 * <desc> 版本描述
 */
package com.sd365.permission.centre.api;

import com.sd365.common.core.common.api.CommonPage;
import com.sd365.permission.centre.entity.Node;
import com.sd365.permission.centre.entity.Role;
import com.sd365.permission.centre.pojo.dto.*;
import com.sd365.permission.centre.pojo.query.RoleQuery;
import com.sd365.permission.centre.pojo.query.UserQuery;
import com.sd365.permission.centre.pojo.vo.RoleCompanyVO;
import com.sd365.permission.centre.pojo.vo.RoleVO;
import io.swagger.annotations.*;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.List;


/**
 *  主要方法为 角色分配资源（assignResource）和角色分配用户（assignUser）
 *  其他方法较为常规主要是针对角色的增删改查
 * @Class RoleApi
 * @Author TangZaoBang
 * @Date 2023/06/10 13:09
 * @Version 1.0.0
 */
@CrossOrigin
@Api(tags = "角色管理 ", value = "/permission/centre/v1/role")
@RequestMapping(value = "/permission/centre/v1/role")
@Validated
public interface RoleApi {

    /**
     * 在系统启动时候将初始化角色和资源的关系，主要为网关鉴权服务
     * @author TangZaoBang
     * @date 2023/06/08 21:05
     * @param role 不同的角色初始化不同的资源到内存
     * @return java.lang.Boolean   成功则true 否则false
     */
    @ApiOperation(tags = "调用接口初始化角色和资源关系", value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code=-1,message = "没有更新记录,非0码则代表失败")
    }
    )
    @PutMapping(value = "/initRoleReourceRedis")
    Boolean initRoleResourceRedis(@ApiParam(name = "role", type = "Role", required = true) @NotNull Role role);


    /**
     * 为角色分配资源 支持选择多个角色统一分配资源
     * @author TangZaoBang
     * @date 2023/06/08 21:06
     * @param roleResourceDTO 对象包含角色id列表和资源列表 为必须填写
     * @return java.lang.Boolean 成功则true 否则false 异常则被全局统一异常捕获
     */
    @ApiOperation(tags = "为多角色分配多资源", value = "")
    @ApiImplicitParam(name = "roleResourceDTO",value = "角色对应资源对象",required = true,dataType = "RoleResourceDTO",paramType = "body")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code=-1,message = "没有更新记录,非0码则代表失败")
    }
    )
    @PostMapping(value = "/assignResource")
    @ResponseBody
    Boolean assignResource(@NotNull @Valid @RequestBody RoleResourceDTO roleResourceDTO);


    /**
     * 为角色分配用户
     * @author TangZaoBang
     * @date 2023/06/08 21:20
     * @param userRoleDTO 当前勾选的用户以及从用户查询对话框多选的用户
     * @return java.lang.Boolean 插入成功则true 失败则false 异常则被全局统一异常捕获
     */
    @ApiOperation(tags = "为多角色分配多用户", value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code=-1,message = "没有更新记录,非0码则代表失败")
    }
    )
    @PostMapping(value = "/assignUser")
    @ResponseBody
    Boolean assignUser(@NotNull @Valid @RequestBody UserRoleDTO userRoleDTO);




    /**
     * 查询角色表中包含的公司
     * @author TangZaoBang
     * @date 2023/06/08 21:19
     * @return java.util.List<com.sd365.permission.centre.entity.Node>
     */
    @ApiOperation(tags = "查询角色表中包含的公司", value = "")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code=-1,message = "没有更新记录,非0码则代表失败")
    })
    @GetMapping(value = "/selectCompany")
    @ResponseBody
    List<Node> selectCompany();



    /**
     * 增加角色,允许不带资源列表，后续用户通过assignRoleResource接口增加资源
     * @author TangZaoBang
     * @date 2023/06/08 21:26
     * @param roleDTO 角色DTO 必须包含名字 和code
     * @return java.lang.Boolean 成功则true 否则false 异常则被全局统一异常捕获
     */
    @ApiOperation(tags = "增加角色", value = "")
    @ApiImplicitParam(name = "roleDTO",value = "增加的角色",required = true,dataType = "RoleDTO",paramType = "body")
    @ApiResponses({
            @ApiResponse(code = 0,message = "请求成功"),
            @ApiResponse(code=-1,message = "没有更新记录,非0码则代表失败")
    })
    @PostMapping(value = "")
    @ResponseBody
    Boolean add(@NotNull @Valid @RequestBody RoleDTO roleDTO);

    /**
     *  删除角色，同时删除角色对应资源
     * @author TangZaoBang
     * @date 2023/06/08 21:28
     * @param id 角色id
     * @param version  角色记录版本
     * @return true成功 false失败 如果内部删除主表和明细表失败则引发异常
     */
    @ApiOperation(tags = "删除角色", value = "")
    @ApiImplicitParams({@ApiImplicitParam(name = "id",required =true,dataType = "Long",paramType = "query"),
            @ApiImplicitParam(name = "version",required =true,dataType = "Long",paramType = "query")}
    )
    @DeleteMapping(value = "")
    @ResponseBody
    Boolean removeByIdAndVersion(@ApiParam(value = "当前行id", required = true) @NotNull @RequestParam("id") Long id,
                                 @ApiParam(value = "当前行版本", required = true) @NotNull @RequestParam("version") Long version);


    /**
     * 通过id数组  批量删除角色，同时删除角色关联的资源
     * @author TangZaoBang
     * @date 2023/06/08 21:29
     * @param idVersions 传入的id version的集合
     * @return java.lang.Boolean成功则true 否则false 如果批量中一条失败则引发事务回滚
     */
    @ApiOperation(tags = "批量删除角色", value = "")
    @ApiImplicitParams({@ApiImplicitParam(name = "roleIds",required =true,dataType = "long[]",paramType = "body")}
    )
    @DeleteMapping(value = "/batch")
    @ResponseBody
    Boolean batchRemove(@NotNull @Valid @RequestBody IdVersion[] idVersions);


    /**
     * 修改角色的数据，依据前端界面改修改只支持角色的信息不包括角色所有用的资源
     * @author TangZaoBang
     * @date 2023/06/08 21:40
     * @param roleDTO 角色基本信息 注意必须填字段
     * @return java.lang.Boolean 成功 true 失败 false 如果触发重复的角色编号等规则可能引发异常全局异常捕获
     */
    @ApiOperation(tags = "修改角色", value = "")
    @ApiImplicitParam(name = "roleDTO",value = "角色对象",required = true,dataType = "RoleDTO",paramType = "body")
    @PutMapping(value = "")
    @ResponseBody
    Boolean updateRole(@NotNull @Valid @RequestBody RoleDTO roleDTO);


    /**
     * 执行数据的查询然后在展示在拷贝对话框
     * @author TangZaoBang
     * @date 2023/06/08 21:42
     * @param id 所选择的拷贝的角色id
     * @return com.sd365.permission.centre.pojo.dto.RoleDTO 依据id返回 角色DTO对象
     */
    @ApiOperation(tags = "拷贝角色", value = "/copyRole")
    @PostMapping(value = "/copy")
    @ResponseBody
    RoleDTO copyRole(@ApiParam(name = "id", type = "String", required = true) @NotNull Long id);


    /**
     * 查询角色带分页
     * @author TangZaoBang
     * @date 2023/06/08 21:58
     * @param roleQuery  角色管理查询区域传入的对象，因为继承自BaseQuery所以自带了查询分页参数
     * @return com.sd365.common.core.common.api.CommonPage<com.sd365.permission.centre.pojo.dto.RoleDTO>
     *     当前页面的角色数据，如果需要希望一页带回数据则可以在查询参数设置PageSize为大数
     */
    @ApiOperation(tags = "查询角色", value = "")
    @ApiImplicitParam(name = "roleQuery",value = "角色查询参数",required = true,dataType = "roleQuery",paramType = "query")
    @GetMapping(value = "")
    @ResponseBody
    CommonPage<RoleDTO> commonQuery(@NotNull RoleQuery roleQuery);


    /**
     * 在ui进行角色绑定相关用户的时候，需要弹出dialog显示用户数据，该方法返回用户列表
     * 可以在RoleService调用UserService或者dao完成
     * @author TangZaoBang
     * @date 2023/06/08 22:01
     * @param userQuery 用户查询条件
     * @return com.sd365.common.core.common.api.CommonPage<com.sd365.permission.centre.pojo.dto.UserDTO> 用户列表
     */
    @ApiOperation(tags = "查询用户", value = "")
    @ApiImplicitParam(name = "userQuery",value = "用户查询参数",required = true,dataType = "UserQuery",paramType = "query")
    @GetMapping(value = "/commonQueryUser")
    @ResponseBody
    CommonPage<UserDTO> commonQueryUser(@NotNull UserQuery userQuery);

    /**
     * 通过角色id返回角色对象
     * @author TangZaoBang
     * @date 2023/06/08 22:02
     * @param id 角色id
     * @return com.sd365.permission.centre.pojo.vo.RoleVO 角色VO对象用于编辑角色需要展示角色数据调用
     */
    @ApiOperation(tags = "查询角色 BY ID", value = "")
    @ApiImplicitParam(name = "id",value = "角色id",required = true,dataType = "Long",paramType = "path")
    @GetMapping(value = "/{id}")
    @ResponseBody
    RoleVO queryRoleById(@NotNull @PathVariable("id") Long id);

    /**
     * 其他模块使用此方法,此方法存在业务理解缺陷
     * @param: 用户id
     * @return: 用户对象的角色 该方法存在缺陷用户可能有多个角色
     */
    /**
     * queryUserResource
     * @author TangZaoBang
     * @date 2023/06/15 02:12
     * @param id roleId
     * @return com.sd365.permission.centre.pojo.vo.RoleVO
     */
    @ApiOperation(tags = "查询用户资源 BY ID", value = "")
    @ApiImplicitParam(name = "id",value = "用户id",required = true,dataType = "Long",paramType = "query")
    @GetMapping(value = "/queryUserResource")
    @ResponseBody
    RoleVO queryUserResource(@NotNull @RequestParam(value = "id", required = true) Long id);

    /**
     * 通过id查询角色公司关系，培训项目不要求实现功能点
     * @param id 公司id
     * @return RoleCompanyVO  公司的角色
     */
    @ApiOperation(tags = "通过id查询角色公司关系", value = "/company")
    @ApiImplicitParam(name = "id",value = "角色id",required = true,dataType = "Long",paramType = "qeury")
    @GetMapping(value = "/company")
    @ResponseBody
    RoleCompanyVO queryRoleCompanyById(@NotNull @RequestParam(value = "id") Long id);


    /**
     * 修改角色公司关系 通过id查询角色公司关系，培训项目不要求实现功能点
     * @author TangZaoBang
     * @date 2023/06/15 02:13
     * @param roleCompanyDTO roleCompanyDTO
     * @return java.lang.Boolean
     */
    @ApiOperation(tags = "修改角色公司关系", value = "/company")
    @ApiImplicitParam(name = "roleCompanyDTO",value = "角色公司对象",required = true,dataType = "RoleCompanyDTO",paramType = "body")
    @PutMapping(value = "/company")
    @ResponseBody
    Boolean modifyRoleCompany(@NotNull @Valid @RequestBody RoleCompanyDTO roleCompanyDTO);


}
